Skip to content

[4주차] 변승현 /[feat] 추가 API 구현#150

Open
gusanans218 wants to merge 3 commits intoLeets-Official:변승현/mainfrom
gusanans218:변승현/4주차

Hidden character warning

The head ref may contain hidden characters: "\ubcc0\uc2b9\ud604/4\uc8fc\ucc28"
Open

[4주차] 변승현 /[feat] 추가 API 구현#150
gusanans218 wants to merge 3 commits intoLeets-Official:변승현/mainfrom
gusanans218:변승현/4주차

Conversation

@gusanans218
Copy link
Copy Markdown

@gusanans218 gusanans218 commented Apr 28, 2026

1. 과제 요구사항 중 구현한 내용

  • 게시물 / 댓글 / 신고 도메인 활용
  • 단순 CRUD를 넘는 기능 직접 설계 및 API 구현
  • 상태(State) 변화를 고려한 설계
  • 동일 요청에 대한 중복 처리 방지 로직 구현
  • 직접 설계한 API 3개 이상 구현

구현한 기능

  • 게시글 신고 API
  • 댓글 신고 API
  • 신고 처리 완료 API
  • 댓글 채택 API
  • 댓글 작성 API

2. 핵심 변경 사항

  • Post, Comment, Report 도메인에 상태값을 추가했습니다.
    • 게시글: ACTIVE, HIDDEN
    • 댓글: ACTIVE, HIDDEN, ADOPTED
    • 신고: PENDING, RESOLVED
  • 신고 도메인을 새로 추가하고, 게시글/댓글 대상 신고 및 처리 로직을 구현했습니다.
  • 동일 사용자가 같은 게시글/댓글을 중복 신고하지 못하도록 중복 방지 로직을 추가했습니다.
  • 게시글 작성자가 댓글을 채택할 수 있도록 구현했고, 한 게시글에는 1개의 채택 댓글만 허용하도록 제한했습니다.
  • 신고 처리 결과에 따라 게시글/댓글 상태가 실제로 변경되도록 서비스 로직을 구성했습니다.

3. 실행 및 검증 결과

  • 실행 결과:
    • 애플리케이션 실행 후 게시글/댓글/신고 API가 정상 동작하는 것을 확인했습니다.
  • 주요 검증 내용:
    • 게시글 신고 등록 가능
    • 댓글 신고 등록 가능
    • 동일 사용자의 동일 대상 중복 신고 차단 가능
    • 신고 처리 시 PENDING -> RESOLVED 상태 변경 확인
    • 댓글 신고 처리 시 댓글 HIDDEN 상태 변경 확인
    • 게시글 신고 처리 시 게시글 HIDDEN 상태 변경 확인
    • 댓글 채택 시 ADOPTED 상태 변경 확인
    • 이미 채택된 댓글이 있는 경우 추가 채택 차단 확인
댓글 신고 처리 완료
스크린샷 2026-04-28 15 41 30
댓글 추가 완료
스크린샷 2026-04-28 15 41 36
이미 채택된 댓글이 있는 경우 추가 채택 차단 확인
스크린샷 2026-04-28 15 41 43
본인 게시물 신고 불가 화면
스크린샷 2026-04-28 15 42 07

4. 완료 사항

게시물 / 댓글 / 신고 도메인 상태 기반 구조 설계
게시글 신고, 댓글 신고, 신고 처리, 댓글 채택 API 구현
중복 신고 방지 및 상태 전이 로직 반영

5. 추가 사항

  • 관련 이슈: closed #135

제출 체크리스트

  • PR 제목이 규칙에 맞다
  • base가 {이름}/main 브랜치다
  • compare가 {이름}/{숫자}주차 브랜치다
  • 프로젝트가 정상 실행된다
  • 본인을 Assignee로 지정했다
  • 파트 담당 Reviewer를 지정했다
  • 리뷰 피드백을 반영한 뒤 머지/PR close를 진행한다

Reviewer 참고

@gusanans218 gusanans218 self-assigned this Apr 28, 2026
@gusanans218 gusanans218 requested review from a team and jihoonkim501 and removed request for jihoonkim501 April 28, 2026 12:14
Copy link
Copy Markdown

@Hanharam Hanharam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 전체적인 흐름과 서비스에서 메서드 책임 분리가 좋았습니다! 나중에 Spring Security를 적용하게 되면 userId는 클라이언트가 보내는 Request DTO에서 직접 받지 말고 보안을 위해 서버의 로그인 정보(토큰/세션 등)에서 바로 꺼내 쓰는 방식으로 수정하면 완벽할 것 같습니다!

Copy link
Copy Markdown

@N-yujeong N-yujeong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 전체적으로 과제 요구사항을 잘 반영하여 구현하신 것 같습니다.

중복 채택 방지와 신고 처리 applyResolution 메서드까지 잘 반영하신 거 같습니다!

Copy link
Copy Markdown

@jihoonkim501 jihoonkim501 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

승현님 수고 많으셨습니다~! 신고, 채택에 대한 고민의 흔적이 많이 보이고 코드에서 의도된 것들 또한 잘 확인되는 것 같습니다~! 제가 남긴 코멘트만 확인해주시면 감사하겠습니다~!

Comment on lines +21 to +34
@PostMapping("/api/posts/{postId}/comments")
public ResponseEntity<ApiResponse<CommentCreateResponse>> createComment(
@PathVariable Long postId,
@Valid @RequestBody CommentCreateRequest request
) {
return ResponseEntity.status(HttpStatus.CREATED)
.body(ApiResponse.success(
"COMMENT_CREATE_SUCCESS",
"댓글 생성 성공",
commentService.createComment(postId, request)
));
}

@PostMapping("/api/comments/{commentId}/adoption")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

댓글 생성은 /api/posts/{postId}/comments처럼 “게시글의 하위 리소스인 댓글” 구조로 잘 잡혀 있는데, 댓글 채택 API는 /api/comments/{commentId}/adoption이라 리소스 기준이 달라 보여요.
댓글 채택도 특정 게시글 안의 특정 댓글에 대한 행동이므로, API 경로를 게시글 기준으로 맞추면 더 일관성 있어 보입니다.

만약 채택상태를 변경한다는 의미를 살리면 Patch 로 하는것 도 좋아보입니다!

@PatchMapping("/api/posts/{postId}/comments/{commentId}/adoption")

Comment on lines +5 to +7
public record CommentAdoptRequest(
@NotNull(message = "userId는 필수입니다.")
Long userId
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

필드값이 하나라면 (지금은) RequestParam으로 받는것도 방법이 될 수 있습니다!

참고로
추후에 인증/인가 주차에서 @AuthenticationPrincipal 또는 userdetail 을 이용하여 유저인증정보를 갖고 구성하면 좋을 것 같습니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants